package com.kang.c0c.symbol;

import java.util.Vector;

import com.kang.c0c.util.Context;

/**
 * 符号表又称名字特性表，是存储出现在源程序代码中的所有用户自定义标识符（主要包括三类
 * 	变量标识符		：Symbol
 * 	常量标识符		：ConstantSymbol
 * 	自定义函数标识符	：FunctionSymbol）
 * 
 * 类SymbolTable与类NameTable其实是同一类的，在SymbolTable中将实例化一个NameTable来存储全局变量
 * 名，这是SymbolTable与NameTable 最大的区别。
 * 而NameTable则是普通的符号表：它是以javaBean的形式存在的，不区分全局与局部，一个NameTable只存储一
 * 个相关局部（全局是一种特殊的局部）的符号表信息，SymbolTable可以看作是一个特殊的NameTable
 * 
 * 全局符号表由SymbolTable来控制，它存储的全局申明的常量、变量以及函数申明符号表信息
 * 而各个函数内部的常量和变量的符号表信息则有这个函数自己的符号表信息内带的NameTable来处理
 * 
 * 增加向量 Vector<String> strList,记录出现在源码中的字符串，并对其进行索引
 * @author kang
 *
 * Feb 4, 2009
 */
public class GlobalTable {
	private static Context.Key symTableKey = new Context.Key();
	
	public static GlobalTable instance(Context context){
		GlobalTable names = (GlobalTable)context.get(symTableKey);
		
		if(names == null){
			names = new GlobalTable(context);
		}		
		return names;
	}
	
	public GlobalTable(Context context){
		super();
		context.put(symTableKey, this);
		nameTable = new NameTable(null);
		strList = new Vector<String>();
	}
	
	public NameTable nameTable;
	
	private Vector<String> strList;
	public String getString(int index){
		if((index <0)||
				(index  >= strList.size()))
			return "";
		
		return strList.elementAt(index);
	}
	
	public int insertString(String str){
		strList.add(str);
		
		return strList.size()-1;
	}
	
	public int listSize(){
		return strList.size();
	}
}